
package com.x52im.rbchat.network.http.async;

import android.app.Activity;
import android.util.Log;

import com.eva.android.widget.DataLoadingAsyncTask2;
import com.eva.android.widget.WidgetUtils;
import com.eva.android.widget.alert.AlertDialog;
import com.eva.framework.dto.DataFromServer;
import com.x52im.rbchat.MyApplication;
import com.x52im.rbchat.R;
import com.x52im.rbchat.cache.GroupsProvider;
import com.x52im.rainbowchat.http.logic.dto.RosterElementEntity;
import com.x52im.rbchat.network.http.HttpRestHelper;
import com.x52im.rainbowchat.http.logic.dto.GroupEntity;
import com.x52im.rbchat.utils.ActivityRequestCode;
import com.x52im.rbchat.utils.IntentFactory;

import net.x52im.mobileimsdk.android.ClientCoreSDK;

/**
 * 查询指定群组的基本信息.
 * <p>
 * 使用异步线程实现，提升用户体验.
 * <p><b>重要说明：</b>本类中excute(..)方法执行时，需要传入2个参数，参见 gid 、myUserId。
 *
 * @author Tony.ma
 * @since 4.3
 */
public class QueryGroupInfo extends DataLoadingAsyncTask2<Object, Integer, DataFromServer> {
    private final static String TAG = QueryGroupInfo.class.getSimpleName();

    // 查询的群id
    private String gid = null;
    // 非必须参数，如果本参数不为空，则表示要同时把”我“在该群中的昵称给查出来，否则不需要查
    private String myUserId = null;

    public QueryGroupInfo(Activity context) {
        super(context, context.getString(R.string.general_loading));
    }

    /**
     * 在后台执行查询.
     *
     * @param parems 外界传进来的参数
     * @return 查询结果，将传递给onPostExecute(..)方法
     */
    @Override
    protected DataFromServer doInBackground(Object... parems) {
        gid = (String) parems[0];
        myUserId = (String) parems[1];

        return HttpRestHelper.submitGetGroupInfoToServer(gid, myUserId);
    }

    //* 到了本方法里即意味着与服务端的交互成功了
    @Override
    protected void onPostExecuteImpl(Object jsonOfResult) {
        GroupEntity groupInfo = null;

        boolean needAlert = true;

        //服务端返回的用户信息不为空，即证明该用户存在，否则表示不存在该用户
        if (jsonOfResult != null && (groupInfo = HttpRestHelper.parseGetGroupInfoFromServer((String) jsonOfResult)) != null) {
            // 在查到的信息里看看我是否还要此群中
            boolean imIsInThisGroup = groupInfo.myselfIsInGroup();
            // 我已不在此群里了
            if (!imIsInThisGroup) {
                Log.i(TAG, "【查询群信息】gid=" + gid + ", myUserId=" + myUserId + " 【结果：NO-我已不在此群内！】(尝试清除群列表缓存中的记录）");
                // 尝试更新一下本地群列表（这可能是网络延迟或网络不好的时候，没有加载到最新的群列表，正好此时更新一下）
                MyApplication.getInstance(context).getIMClientManager().getGroupsProvider().remove(groupInfo.getG_id());
            }
            // 我在此群里
            else {
                Log.i(TAG, "【查询群信息】gid=" + gid + ", myUserId=" + myUserId + " 【结果：YES-我在此群内】(尝试更新群列表缓存中的信息为最新）");

                needAlert = false;

                // 将取到的最新群信息先更新到群列表数据模型中，尽可能确保内存数据是最新的
                MyApplication.getInstance(context).getIMClientManager().getGroupsProvider().updateGroup(groupInfo);

                // 转到群信息查看界面
                ((Activity) context).startActivityForResult(IntentFactory.createGroupInfoIntent(context, groupInfo), ActivityRequestCode.REQUEST_CODE_FOR_VIEW_GROUP_INFO);
            }
        }

        if (needAlert) {
            // 该群不存在
            new AlertDialog.Builder(context)
                    .setTitle(R.string.general_tip)
                    .setMessage("没有查到该群信息，该群已解散或您已不在群内！")
                    .setNegativeButton(R.string.general_ok, null)
                    .show();
        }
    }


    /**
     * 查看群信息。
     *
     * @param context 上下文
     * @param gid     群id
     * @param ge      群信息数据，如果此数据不为空，将优先查看此数据
     */
    public static void gotoWatchGroupInfo(Activity context, String gid, GroupEntity ge) {

        // 如果ge内容不为空，由直接查看
        if (ge != null) {
            // 直接转到群信息查看界面
            context.startActivityForResult(IntentFactory.createGroupInfoIntent(context, ge), ActivityRequestCode.REQUEST_CODE_FOR_VIEW_GROUP_INFO);
            return;
        }

        // 有网络的情况下，优先从网络加载最新数据
        if (ClientCoreSDK.getInstance().isConnectedToServer()) {
            RosterElementEntity localUserInfo = MyApplication.getInstance2().getIMClientManager().getLocalUserInfo();
            if (localUserInfo != null) {
                // 从服务端加载最新群基本信息
                new QueryGroupInfo(context).execute(gid, localUserInfo.getUser_uid());
                return;
            }
        }

        // 否则，就读取缓存数据
        GroupsProvider gp = MyApplication.getInstance2().getIMClientManager().getGroupsProvider();
        if (gp != null) {
            GroupEntity g = gp.getGroupInfoByGid(gid);
            if (g != null) {
                // 转到转到群信息查看界面
                context.startActivityForResult(IntentFactory.createGroupInfoIntent(context, g), ActivityRequestCode.REQUEST_CODE_FOR_VIEW_GROUP_INFO);
                return;
            }
        }

        WidgetUtils.showToastLong(context, context.getResources().getString(R.string.chat_message_send_error), WidgetUtils.ToastType.WARN);
    }
}
